package marja;

import java.util.Calendar;
import java.util.GregorianCalendar;

import steffen.WSVException;

/**
 * die Klasse stellt die Funktionen zur Verfügung die alle Leihgegenstände gebrauchen
 * 
 * @author Marja Ahlbrand
 *
 */
public class Gegenstand
{

    // Attribute
    /**
     * in dem Attribut wird das Ausleihdatum gespeichert
     */
    GregorianCalendar datumVon = new GregorianCalendar();
    /**
     * in dem Attribut wird das Rückgabedatum gespeichert.
     *Sollange der Gegenstand nicht zurückgegeben ist ist das Attribut null
     */
    GregorianCalendar datumBis = null; // ist solange null bis der Gegenstand
                              // zurückgegeben wird

    protected long stunden;
    protected int kundenindex;
    protected double endpreis;
    protected double preisProStunde;
    protected double zusatzGebühr = 0;
    protected String bezeichnung;
    /**
     * Anzahl wie viele Gegenstände mit dem Objekt verliehen werden
     */
    protected int count;
    /**
     * gibt an ob ein Ausleihvorgang abgeschlossen ist
     * wenn der Vorgang abgeschlossen ist wird das Attribut auf true gesetzt
     */
    protected boolean istBezahlt = false;
    
   
    //Konstruktor
    
    /**
     * ruft die Methode datumVerarbeiten(datum) auf und setzt datumVon, sowie kundennummer
     * @param kundenindex
     * @param datum Ausleihdatum
     * @param count
     * @throws WSVException 
     */
    public Gegenstand(int kundenindex, String datum, int count)
    {
        int[] datumArray = datumVerarbeiten(datum);
        datumVon.set(datumArray[0], datumArray[1], datumArray[2], datumArray[3], datumArray[4]);
        this.count=count;
        this.kundenindex = kundenindex;
        
    }


    // Methoden

    
    //getter
    // Gibt die Bezeichnung des Gegenstandes als String zurück
    /**
     * @return gibt die Bezeichnung des Ausleihgegenstands zurück
     */
    public String getBezeichnung()
    {
        return bezeichnung;
    }

    /**
     * 
     * @return gibt den Kundenindex, von dem Kunden, der den Gegenstand geliehen hat zurück.
     */
    public int getKundenindex()
    {
        return kundenindex;
    }
    
    /**
     * 
     * @return gibt den Kalkulierten Preis zurück
     */
    public double getEndpreis()
    {
        return endpreis;
    }
    
    /**
     * 
     * @return gibt die Stunden zurück wie lange ein Gegenstand ausgeliehen war
     */
    protected long getStunden()
    {
        return stunden;
    }
    
    /**
     * 
     * @return gibt die Anzahl der mit diesem Objekt geliehenen Leihgegenstände zurück
     */
    public int getCount()
    {
        return count;
    }

    /**
     * 
     * @return gibt das Datum datumVon als GregorianCalendar Objekt zurück
     */
    public GregorianCalendar getDatumVon()
    {
        return datumVon;
    }

    /**
     * 
     * @return gibt das Datum datumBis als GregorianCalendar Objekt zurück
     */
    public GregorianCalendar getDatumBis()
    {
        return datumBis;
    }
    
    /**
     * 
     * @return boolean true wenn der Leihvorgang beglichen wurde
     */
    public boolean getIstBezahlt()
    {
        return istBezahlt;
    }
    
    
    /**
     * 
     * @return String wenn getIstBezahlt() true dann "bezahlt" sonnst "nicht bezahlt"
     */
    public String getIstBezahltString()
    {
        if(getIstBezahlt())
            return "bezahlt";
        return "nicht bezahlt";
    }
    
    /**
     * 
     * @return gibt das Datum datumVon als String zurück
     */
    public String getDatumVonString()
    {
        return(datumVon.get(Calendar.DAY_OF_MONTH)+"."+
                (datumVon.get(Calendar.MONTH)+1)+"."+
                datumVon.get(Calendar.YEAR)+"-"+
                datumVon.get(Calendar.HOUR_OF_DAY)+":"+
                out(datumVon.get(Calendar.MINUTE)));   
    }
    
    /**
     * 
     * @return gibt das Datum datumBis als String zurück
     */
    public String getDatumBisString()
    {
        return(datumBis.get(Calendar.DAY_OF_MONTH)+"."+
                (datumBis.get(Calendar.MONTH)+1)+"."+
                datumBis.get(Calendar.YEAR)+"-"+
                datumBis.get(Calendar.HOUR_OF_DAY)+":"+
                out(datumBis.get(Calendar.MINUTE)));   
    }
    
    
    /**
     * wird für die Ausgabe von Daten benötigt, damit die Minuten mit zwei Stellen angegeben werden
     * @param Minuten
     * @return Minuten als zweistelliger String
     */
    private String out( int i ) 
    {
        return ( i >= 10 ) ? Integer.toString(i) : "0"+i;
    }

    /**
     * setzt istBezahlt auf true
     */
    public void abrechnen()
    {
        istBezahlt = true;
    }
    
    /**
     * Verarbeitet das eingegebene Datum zu einem int Array (jahr,monat,tag,stunde,minute)
     * @param datum als String im Format "TT.MM.YY-HH:MM"
     * @return Array (jahr,monat,tag,stunde,minute)
     * @throws WSVException 
     */
    protected int[] datumVerarbeiten(String datum)
    {

        datum = datum.trim(); // Löscht vorgestellte und nachgestellte
                              // Leerzeichen
        int tag = Integer.parseInt(datum.substring(0, 2));
        int monat = (Integer.parseInt(datum.substring(3, 5)) - 1); // -1 wegen
                                                                   // der
                                                                   // Zählung
                                                                   // der Monate
                                                                   // bei
                                                                   // GregorianCalendar
        int jahr = 2000 + Integer.parseInt(datum.substring(6, 8));
        int stunde = Integer.parseInt(datum.substring(9, 11));
        int minute = Integer.parseInt(datum.substring(12, 14));

        int[] datumArray = { jahr, monat, tag, stunde, minute };
        return datumArray;
    }

    /**
     * Wird aufgerufen wenn ein Leihgegenstand zurückgegeben wird
     * ruft intern die Methoden datumVerarbeiten(datum) auf und setzt datumBis
     * @param datumBis als String
     * @throws WSVException 
     */
    public void zurückgeben(String datumBis) 
    {
        int[] datumArray = datumVerarbeiten(datumBis);
        this.datumBis = new GregorianCalendar();
        this.datumBis.set(datumArray[0], datumArray[1], datumArray[2], datumArray[3], datumArray[4]);
        datumsDiff();
        kalkuliereKosten();
    }

    /**
     * berechnet die Differenz von datumBis und datumVon in Stunden
     * jede angefangene Stunde wird als volle Stunde gerechnet
     */
    protected void datumsDiff()
    {
        long zeit = datumBis.getTime().getTime() - datumVon.getTime().getTime(); // Differenz
                                                                                 // in
                                                                                 // ms
        long minuten = Math.round(((double) zeit) / (60. * 1000.)); // Differenz
                                                                   // in Minuten
        stunden = minuten/60;
        if (minuten%60 >0)
        {
            stunden++;
        }
    }
    
    /**
     * bietet die Möglichkeit zu überprüfen ob ein eingegebenes Rückgabedatum nach dem Ausleihdatum liegt
     * @param datum gewünschtes Rückgabedatum
     * @return true wenn das übergebene Datum zulässig ist
     * @throws WSVException 
     */
    public boolean zulässigesDatumBis(String datum) 
    {
        GregorianCalendar datumBisTemp= new GregorianCalendar();
        int[] datumArray = datumVerarbeiten(datum);
        datumBisTemp.set(datumArray[0], datumArray[1], datumArray[2], datumArray[3], datumArray[4]);
        
        return datumVon.before(datumBisTemp);
    }
    
    /**
     * Bietet die Möglichkeit zu überprüfen ob ein übergebenes Datum nach dem Rückgabedatum datumBis liegt
     * @param datum als String
     * @return true wenn das übergebene Datum später ist als das Rückgabedatum
     * @throws WSVException 
     */
    public boolean späterDatumBis(String datum) 
    {
        int[] datumArray = datumVerarbeiten(datum);
        GregorianCalendar datumTemp= new GregorianCalendar();
        datumTemp.set(datumArray[0], datumArray[1], datumArray[2], datumArray[3], datumArray[4]);
        return (datumBis.before(datumTemp) || datumBis.equals(datumTemp));       
    }

   /**
    * kalkuliert die Ausleihgebühr und speichert diese in endpreis
    */
   protected void kalkuliereKosten()
    {
        endpreis = (stunden * preisProStunde + zusatzGebühr)*count;     
    }
}